/**
 * 事件队列包括宏任务队列和微任务队列
 * 宏任务（macrotask queue）: ajax,setTimeout,setInterval,DOM监听,UI Rendering等
 * 微任务（microtask queue）: Promise的then回调,Mutation Observer API,queueMicrotask()等
 * 规范：
 *  1. main script主线程中的代码优先执行
 *  2. 在执行任何一个宏任务之前(不是队列，是一个宏任务),都会先查看微任务队列中是否还有任务需要执行
 *     - 宏任务执行之前，必须保证微任务队列是空的
 *     - 如果不为空，那么优先执行微任务队列中的任务
 */
console.log('script start')

setTimeout(() => {
  console.log('这是一个宏任务，2s后执行')
}, 2000)

setTimeout(() => {
  console.log('这是一个带Promise的定时器宏任务，3s后执行')
  Promise.resolve().then((res) => {
    console.log('这是一个定时器宏任务下的Promise')
  })
}, 3000)

Promise.resolve('abc').then((res) => {
  console.log('promise callback --微任务', res)
})

console.log('script stop')
